<?php

class Parada extends AppModel {

    /**
     * Nombre de la tabla en base de datos
     *
     * Tabla relacionada con el modelo en cuestión, este atributo será usado para la generación
     * de consultas a la base de datos
     *
     * @var string
     */
    public $useTable = "paradas";

    /**
     * Clave primaria de la base de datos
     *
     * clave primaria que indentifica cada registro de la tabla en cuestión
     *
     * @var string
     */
    public $primaryKey = "id_parada";

    /**
     * Nombre del campo que se muestra cuando se hacen busquedas del modelo
     *
     * Nombre del campo que se muestra cuando se hacen busquedas del modelo
     *
     * @var string
     */
    public $displayField = "nombre_parada";

    /**
     * Nivel de recusividad para la busqueda de entidades relacionadas
     *
     * Este campo sirve para indicar si una consulta debe incluir las entidades
     * relacionadas con el modelo en cuestión, -1 quiere decir, 0 q.. y 1 ..
     *
     * @var int
     */
    public $recursive = -1;

    /**
     * Nombre del modelo
     *
     * Nombre del modelo para un alias las consultas y busquedas, ingresos y
     * otras interacciones con la base de datos.
     *
     * @var string
     */
    public $name = "Parada";

    /**
     * Orden por defecto
     *
     * Orden por defecto para las consultas que se realicen a la base de datos,
     * se pueden incluir varios campos de la base de datos. Y si se especifica
     * otro orden este no se tiene en cuenta.
     *
     * @var array(string)
     */
    public $order = array("Parada.id_parada");

    /* Relaciones existentes de las paradas */
    public $hasMany = array(
        "RutaParada" => array(
            "className" => "RutaParada",
            "foreignKey" => "id_parada"
        ),
        "RecorridoRealizadoParada" => array(
            "className" => "RecorridoRealizadoParada",
            "foreignKey" => "id_parada"
        )
    );

    /**
     * Validaciones del modelo
     *
     * Validaciones de los diferentes campos que se usan en el modelo
     *
     * @var array(array(string))
     */
    public $validate = array(
        'nombre_parada' => array(
            'notEmpty-1' => array(
                'rule' => 'notEmpty',
                'message' => 'debe ingresar un nombre de parada',
                'required' => true
            ),
            'maxLength-2' => array(
                'rule' => array('maxLength', 30),
                'message' => 'la máxima longitud del nombre de parada es de 30 caracteres'
            )
        ),
        'direccion_parada' => array(
            'notEmpty-1' => array(
                'rule' => 'notEmpty',
                'message' => 'debe ingresar un dirección de parada',
                'required' => true
            ),
            'maxLength-2' => array(
                'rule' => array('maxLength', 50),
                'message' => 'la máxima longitud de la dirección de la parada es de 50 caracteres'
            )
        ),
        'latitud' => array(
            'notEmpty-1' => array(
                'rule' => 'notEmpty',
                'message' => 'debe ingresar una latitud de parada',
                'required' => true
            ),
            'numeric-2' => array(
                'rule' => 'numeric',
                'message' => 'la latitud de parada debe ser un número'
            ),
            'range-3' => array(
                'rule' => array('range', -90, 90),
                'message' => 'la latitud de parada debe ser un número entre -90 y 90'
            )
        ),
        'longitud' => array(
            'notEmpty-1' => array(
                'rule' => 'notEmpty',
                'message' => 'debe ingresar una longitud de parada',
                'required' => true
            ),
            'numeric-2' => array(
                'rule' => 'numeric',
                'message' => 'la longitud de la parada debe ser un número'
            ),
            'range-3' => array(
                'rule' => array('range', -180, 180),
                'message' => 'la longitud de parada debe ser un número entre -180 y 180'
            )
        ),
        'estado_parada' => array(
            'notEmpty-1' => array(
                'rule' => 'notEmpty',
                'required' => "create",
                'message' => 'debe ingresar un estado de parada',
            ),
            'inList-2' => array(
                'rule' => array('inList', array('activa', 'inactiva')),
                'message' => 'el estado de la parada debe ser activa o inactiva'
            )
        ),
        'fecha_creacion_parada' => array(
            'notEmpty-1' => array(
                'rule' => 'notEmpty',
                'required' => "create",
                'message' => 'debe ingresar una fecha de creación para la parada',
            ),
            'datetime-2' => array(
                'rule' => array('datetime', 'ymd'),
                'message' => 'fecha de creación de parada inválida'
            )
        ),
        'fecha_modificacion_parada' => array(
            'notEmpty-1' => array(
                'rule' => 'notEmpty',
                'message' => 'debe ingresar un estado de parada',
                'required' => true
            ),
            'datetime-2' => array(
                'rule' => array('datetime', 'ymd'),
                'message' => 'fecha de modificación de parada inválida'
            )
        ),
        "id_parada" => array(
            "notEmpty" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => "update",
                "message" => "Id de la parada no puede estar vacio",
            ),
            "naturalNumber_NoZero" => array(
                "rule" => array("naturalNumber", false),
                "message" => "Id de la parada debe ser un número entero diferente de cero",
            ),
            "isUnique" => array(
                "rule" => array("isUnique"),
                "message" => "Id de la parada debe ser único",
            ),
        )
    );

    /**
     * Funcion save
     *
     * Permite asignar el valor de las fechas de creacion y modificacion,
     * en caso de la fecha de creacion revisa si ya tiene un valor en $data
     * y eso evita que se le vuelva a asignar la fecha actual.
     * @var string
     */
    public function save($data = null, $validate = true, $fieldList = array()) {
        $this->set($data);
        if (!isset($data['Parada']['fecha_creacion_parada'])) {
            $this->set(array('fecha_creacion_parada' => date("Y/m/j H:i:s")));
        }
        $this->set(array('fecha_modificacion_parada' => date("Y/m/j H:i:s")));
        if (!isset($data['Parada']['estado_parada'])) {
            $this->set(array('estado_parada' => 'activa'));
        }
        return parent::save($this->data, $validate, $fieldList);
    }

    /**
     * Borrar Parada.
     *
     * Se borra la parada si no esta siendo usada en recorridos, de lo contrario
     * su estado pasa a inactiva
     *
     * @param int $id de la parada
     * @param cascade para borrar los hijos de la misma
     */
    public function delete($id = null, $cascade = true) {
        $parada = $this->find('first', array(
            'conditions' => array('Parada.id_parada' => $id),
            'recursive' => 1,
        ));
        $hasChilds = false;
        foreach ($parada as $child_model => $i) {
            if (in_array($child_model, array("RutaParada")) && sizeof($parada[$child_model]) != 0) {
                $hasChilds = true;
                break;
            }
        }
        if (!$hasChilds) {
            $db = $this->getDataSource();
            $db->begin();

            $deleteParada = parent::delete($id, $cascade);
            if ($deleteParada) {
                $db->commit();
                return true;
            } else {
                $db->rollback();
                return false;
            }
        } else {
            $parada["Parada"]["estado_parada"] = "inactiva";
            return $this->save($parada);
        }
    }

}

?>